/**
 * 通用js方法封装处理
 * Copyright (c) 2019 rds
 */

import { generateNodeStream } from 'jszip'

const baseURL = process.env.VUE_APP_BASE_API

// 日期格式化
export function parseTime(time, pattern) {
  if (arguments.length === 0 || !time) {
    return null
  }
  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time)
    } else if (typeof time === 'string') {
      time = time.replace(new RegExp(/-/gm), '/')
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

// 表单重置
export function resetForm(refName) {
  if (this.$refs[refName]) {
    this.$refs[refName].resetFields()
  }
}

// 添加日期范围
export function addDateRange(params, dateRange, propName) {
  var search = params
  search.params = {}
  if (null != dateRange && '' != dateRange) {
    if (typeof propName === 'undefined') {
      search.params['beginTime'] = dateRange[0]
      search.params['endTime'] = dateRange[1]
    } else {
      search.params['begin' + propName] = dateRange[0]
      search.params['end' + propName] = dateRange[1]
    }
  }
  return search
}

// 回显数据字典
export function selectDictLabel(datas, value) {
  var actions = []
  Object.keys(datas).some(key => {
    if (datas[key].dictValue == '' + value) {
      actions.push(datas[key].dictLabel)
      return true
    }
  })
  return actions.join('')
}

// 回显数据字典（字符串数组）
export function selectDictLabels(datas, value, separator) {
  var actions = []
  var currentSeparator = undefined === separator ? ',' : separator
  var temp = value.split(currentSeparator)
  Object.keys(value.split(currentSeparator)).some(val => {
    Object.keys(datas).some(key => {
      if (datas[key].dictValue == '' + temp[val]) {
        actions.push(datas[key].dictLabel + currentSeparator)
      }
    })
  })
  return actions.join('').substring(0, actions.join('').length - 1)
}

// 通用下载方法
export function download(fileName) {
  window.location.href =
    baseURL +
    '/common/download?fileName=' +
    encodeURI(fileName) +
    '&delete=' +
    true
}

// 字符串格式化(%s )
export function sprintf(str) {
  var args = arguments,
    flag = true,
    i = 1
  str = str.replace(/%s/g, function() {
    var arg = args[i++]
    if (typeof arg === 'undefined') {
      flag = false
      return ''
    }
    return arg
  })
  return flag ? str : ''
}

// 转换字符串，undefined,null等转化为""
export function praseStrEmpty(str) {
  if (!str || str == 'undefined' || str == 'null') {
    return ''
  }
  return str
}

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentid',
    childrenList: children || 'children'
  }

  var childrenListMap = {}
  var nodeIds = {}
  var tree = []

  for (let d of data) {
    let parentId = d[config.parentId]
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = []
    }
    nodeIds[d[config.id]] = d
    childrenListMap[parentId].push(d)
  }

  for (let d of data) {
    let parentId = d[config.parentId]
    if (nodeIds[parentId] == null) {
      tree.push(d)
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t)
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]]
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c)
      }
    }
  }
  return tree
}

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 子节点字段 默认 'children'
 */
export function handleTreeParentid(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentid',
    childrenList: children || 'children'
  }

  var childrenListMap = {}
  var nodeIds = {}
  var tree = []

  for (let d of data) {
    let parentId = d[config.parentId]
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = []
    }
    nodeIds[d[config.id]] = d
    childrenListMap[parentId].push(d)
  }

  for (let d of data) {
    let parentId = d[config.parentId]
    if (nodeIds[parentId] == null) {
      tree.push(d)
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t)
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]]
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c)
      }
    }
  }
  return tree
}

export function dataFormat(key, val) {
  if (key === 'typeid') {
    var type = ''
    let optionData = JSON.parse(sessionStorage.getItem('optionsData'))
    optionData.typeOptions.forEach((item, index) => {
      if (item.id === val) {
        type = item.description
      }
    })
    return type
  } else if (key === 'policyid') {
    var policy = ''
    let optionData = JSON.parse(sessionStorage.getItem('optionsData'))
    optionData.policyOptions.forEach((item, index) => {
      if (item.id === val) {
        policy = item.description
      }
    })
    return policy
  } else if (key === 'stateid') {
    var state = ''
    let optionData = JSON.parse(sessionStorage.getItem('optionsData'))
    optionData.stateOptions.forEach((item, index) => {
      if (item.id === val) {
        state = item.description
      }
    })
    return state
  } else if (key === 'ownerid') {
    var owner = ''
    let optionData = JSON.parse(sessionStorage.getItem('optionsData'))
    optionData.userOptions.forEach((item, index) => {
      if (item.userId === val) {
        owner = item.userName
      }
    })
    return owner
  } else if (key === 'status') {
    if (val === '1') {
      return '正常'
    } else {
      return '禁用'
    }
  } else if (key === 'companyId') {
    var organiz = ''
    let organizOption = this.$store.state.optionInfo.Organiz
    organizOption.forEach((item, index) => {
      if (item.id === val) {
        organiz = item.name
      }
    })
    return organiz
  } else if (key === 'classfication') {
    var res = ''
    if (val) {
      res = val.replace(
        /--->/g,
        '<img src="/static/image/iconTreeToArrow.gif" style="vertical-align:middle;"/>'
      )
    }
    return res
  } else if (key === 'date') {
    // 将字符串转换为 Date 对象
    let date = new Date(val.trim())
    // 使用 Date 对象的方法来格式化日期
    let year = date.getFullYear()
    let month = ('0' + (date.getMonth() + 1)).slice(-2)
    let day = ('0' + date.getDate()).slice(-2)
    let hours = ('0' + date.getHours()).slice(-2)
    let minutes = ('0' + date.getMinutes()).slice(-2)
    let seconds = ('0' + date.getSeconds()).slice(-2)

    // 组合成 YYYY-MM-DD HH:mm:ss 格式的字符串
    let formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
    return formattedDate
  } else {
    let label = val
    if (label != null) {
      let tempDicts = JSON.parse(sessionStorage.getItem('tempDicts'))
      if (tempDicts[key] && tempDicts[key].length > 0) {
        tempDicts[key].forEach(item => {
          if (item) {
            if (String(item.dictValue).trim() == String(label).trim()) {
              label = item.dictLabel
            } else if (String(item.id).trim() == String(label).trim()) {
              label = item.name || item.folderName || item.description
            }
          }
        })
        return label
      }
      return label
    }
  }
}
